package com.example.dense_rack_server.utils;

public class AdrAddress {

    // 每节的板子数量（每8位一个板子，每列16位）
    private static final int BOARDS_PER_COLUMN = 2; // 每列的板位数

    /**
     * 根据列号、层数和板位计算ADR地址
     *
     * @param joint       节数（1开始）
     * @param layer       层数（1开始）
     * @param board       板位号（1开始） 位置小于等于8 传1   大于8 传2
     * @param totalColumn 总列数
     * @return ADR地址（整数）
     */
    public static int calculateADR(int joint, int layer, int board, int totalColumn) {
        // 计算ADR地址：按层→列→板位的顺序编号
        // 前面所有层的板子总数 + 当前层前面所有列的板子总数 + 当前列的板位
        int adr = (layer - 1) * totalColumn * BOARDS_PER_COLUMN
                + (joint - 1) * BOARDS_PER_COLUMN
                + board;

        return adr;
    }


    /**
     * 计算adr地址
     *
     * @param totalLayers 总层数
     * @param totalJoint  总节数
     * @param layer       当前层数
     * @param joint       当前节数
     * @param position    当前位置（1到16）
     * @return adr地址
     */
    public static int calculateAdrAddress(int totalLayers, int totalJoint, int layer, int joint, int position) {
        if (position < 1 || position > 16) {
            throw new IllegalArgumentException("Position must be between 1 and 16.");
        }
        // 计算当前板子的索引
        int baseIndex = (layer - 1) * (totalJoint * BOARDS_PER_COLUMN) + (joint - 1) * BOARDS_PER_COLUMN;
        // 根据位置确定板子的adr地址
        if (position <= 8) {
            return baseIndex + 1;
        } else {
            return baseIndex + 2;
        }
    }

    /**
     * 计算总的adr地址
     *
     * @param totalLayers 总层数
     * @param totalJoint  总节数
     * @return 所有板子的adr地址的总和
     */
    public static int calculateTheTotalAdr(int totalLayers, int totalJoint) {
        int totalAdr = 0;
        for (int layer = 1; layer <= totalLayers; layer++) {
            for (int column = 1; column <= totalJoint; column++) {
                for (int position = 1; position <= 16; position++) {
                    int adrAddress = calculateAdrAddress(totalLayers, totalJoint, layer, column, position);
                    System.out.println("Layer " + layer + ", Column " + column + ", Position " + position + ": adr " + adrAddress);
                    totalAdr = adrAddress;
                }
            }
        }
        return totalAdr;
    }

    public static void main(String[] args) {
        // 示例：计算特定位置的ADR地址
//        try {
//            int specificADR = calculateADR(1, 2, 2, 10);
//            System.out.println("ADR地址：" + specificADR);
//        } catch (IllegalArgumentException e) {
//            System.out.println(e.getMessage());
//        }

        int layers = 4; // 总层数
        int columns = 2; // 总列数

        int totalAdr = calculateTheTotalAdr(layers, columns);
        System.out.println("总的ADR地址：" + totalAdr);

    }
}